home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Toolbox / Visual Basic Toolbox (P.I.E.)(1996).ISO / pgm_ing / tagenv / tagenv.bas < prev    next >
BASIC Source File  |  1992-09-24  |  7KB  |  249 lines

  1.  
  2. '   TAGENV.BAS
  3.  
  4. '   REQUIRES:
  5. '             STRTOK.BAS
  6.  
  7.  
  8. '   TagString subsystem:
  9. '
  10. '   This set of routines provides support for tagged string fields
  11. '   in a VB Form or Control Tag property.
  12. '
  13. '   The Tag property, under this support, consists of a string
  14. '   of keyword=value pairs, delimited by semicolons;  for instance,
  15. '   the following might be a tag string:
  16. '
  17. '   formname=myForm;myname="Thomas A. Dacon";graphsize=large
  18. '
  19. '   You delete a string from a tagged string field by setting it
  20. '   to a null string, just like the SET command in DOS.
  21. '
  22. '   Keywords and contents fields are stored in mixed case, as supplied,
  23. '   but searches for keywords are case-insensitive.
  24.  
  25. '   The API:
  26. '
  27. '   SetFormTagString <form>,    key$, contents$
  28. '   GetFormTagString <form>,    key$, contents$
  29. '
  30. '   SetCtlTagString  <control>, key$, contents$
  31. '   GetCtlTagString  <control>, key$, contents$
  32. '
  33.  
  34.  
  35.     Const FALSE = 0, TRUE = Not FALSE
  36.  
  37. Sub SetFormTagString (f As Form, key As String, contents As String)
  38. '
  39. '   Insert, replace, or delete a key=contents field
  40. '   in a Form's Tag property.
  41. '
  42.     Dim theTagString As String
  43.  
  44.     theTagString = f.Tag
  45.     SetTagSubstring theTagString, key, contents
  46.     f.Tag = theTagString
  47.  
  48. End Sub
  49.  
  50. Sub GetFormTagString (f As Form, key As String, contents As String)
  51. '
  52. '   Get the current value of a key=contents field
  53. '   in a Form's Tag property.  A null string is
  54. '   returned if the key is not found.
  55. '
  56.     GetTagSubstring (f.Tag), key, contents
  57.  
  58. End Sub
  59.  
  60. Sub SetCtlTagString (c As Control, key As String, contents As String)
  61. '
  62. '   Insert, replace, or delete a key=contents field
  63. '   in a Control's Tag property.
  64. '
  65.     Dim theTagString As String
  66.  
  67.     theTagString = c.Tag
  68.     SetTagSubstring theTagString, key, contents
  69.     c.Tag = theTagString
  70.  
  71. End Sub
  72.  
  73. Sub GetCtlTagString (c As Control, key As String, contents As String)
  74. '
  75. '   Get the current value of a key=contents field
  76. '   in a Control's Tag property.  A null string is
  77. '   returned if the key is not found.
  78. '
  79.     GetTagSubstring (c.Tag), key, contents
  80.  
  81. End Sub
  82.  
  83. Sub SetTagSubstring (theTagString As String, key As String, contents As String)
  84. '
  85. '   Internal routine to insert, replace, or delete
  86. '   a key=contents field in a string variable.
  87. '
  88.     Dim tagStringAccumulator As String
  89.     Dim thisString As String
  90.     Dim subString As String
  91.     Dim theKey As String
  92.     Dim substringToAdd As String
  93.  
  94.     tagStringAccumulator = ""
  95.  
  96.     If theTagString <> "" Then
  97.         thisString = theTagString
  98.         foundIt = FALSE
  99.         Do
  100.             subString = StrTok$(thisString, ";")
  101.             thisString = ""              'for subsequent strtok calls
  102.             If subString <> "" Then
  103.                 If Not foundIt Then
  104.                     theKey = ExtractKey$(subString)
  105.                     If theKey <> key Then
  106.                         substringToAdd = subString
  107.                         GoSub AddSubstring
  108.                     Else    'this deletes if new contents = ""
  109.                         foundIt = TRUE
  110.                         If contents <> "" Then
  111.                             substringToAdd = key + "=" + contents
  112.                             GoSub AddSubstring
  113.                         End If
  114.                     End If
  115.                 Else
  116.                     substringToAdd = subString
  117.                     GoSub AddSubstring
  118.                 End If
  119.             End If
  120.         Loop Until subString = ""
  121.  
  122.         '   If we didn't find the key, we need to add the
  123.         '   substring as a new one (providing there's content).
  124.  
  125.         If Not foundIt Then
  126.             If contents <> "" Then
  127.                 substringToAdd = key + "=" + contents
  128.                 GoSub AddSubstring
  129.             End If
  130.         End If
  131.  
  132.     Else                                         'no current contents in tag string
  133.         If contents <> "" Then                   'if user supplied contents,
  134.             substringToAdd = key + "=" + contents
  135.             GoSub AddSubstring
  136.         End If
  137.     End If
  138.  
  139.     '   Return the resulting tag string.
  140.  
  141.     theTagString = tagStringAccumulator
  142.     Exit Sub
  143.  
  144.  
  145. '   Add a substring to the end of the tag string accumulator.
  146.  
  147. AddSubstring:
  148.     If tagStringAccumulator <> "" Then
  149.         tagStringAccumulator = tagStringAccumulator + ";"
  150.     End If
  151.     tagStringAccumulator = tagStringAccumulator + substringToAdd
  152.     Return
  153.  
  154. End Sub
  155.  
  156. Sub GetTagSubstring (theTagString As String, key As String, contents As String)
  157. '
  158. '   Internal routine to retrieve the contents of a key=contents
  159. '   field in a string variable.
  160. '
  161.     Dim thisString As String
  162.     Dim subString As String
  163.  
  164.     contents = ""   'in case we don't find the key
  165.  
  166.     If theTagString <> "" Then
  167.         thisString = theTagString
  168.         Do
  169.             subString = StrTok$(thisString, ";")
  170.             thisString = ""
  171.             If subString <> "" Then
  172.                 If UCase$(ExtractKey$(subString)) = UCase$(key) Then
  173.                     contents = ExtractKeyValue$(subString)
  174.                     Exit Do
  175.                 End If
  176.             End If
  177.         Loop Until subString = ""
  178.     End If
  179.  
  180. End Sub
  181.  
  182. Function ExtractKey$ (theSubString As String)
  183. '
  184. '   Returns the keyword portion of a
  185. '   keyword=value string "kkk=vvvvv"
  186. '
  187.     Dim i As Integer
  188.     Dim theKey As String
  189.  
  190.     i = InStr(theSubString, "=")
  191.     If i <> 0 Then
  192.         theKey = Left$(theSubString, i - 1)
  193.     Else
  194.         theKey = ""
  195.     End If
  196.  
  197.     ExtractKey$ = theKey
  198.  
  199. End Function
  200.  
  201. Function ExtractKeyValue$ (theSubString As String)
  202. '
  203. '   Returns the value portion of a
  204. '   keyword=value string "kkk=vvvvv"
  205. '
  206.  
  207.     Dim i As Integer
  208.     Dim theContents As String
  209.  
  210.     i = InStr(theSubString, "=")
  211.     If i <> 0 Then
  212.         theContents = Mid$(theSubString, i + 1)
  213.     Else
  214.         theContents = ""
  215.     End If
  216.  
  217.     ExtractKeyValue$ = theContents
  218.  
  219. End Function
  220.  
  221. Function ParseKeywordValue (text As String, keyword As String, keyvalue As String) As Integer
  222. '
  223. '   Given a text string of the form:
  224. '           keyword = value
  225. '       or  keyword = "value"
  226. '   parses the keyword and value into the output arguments,
  227. '   stripping leading and trailing blanks, and removing the
  228. '   optional double quotes from the value field.
  229. '
  230. '   Returns Boolean("=" character present, following a non-blank field)
  231. '
  232.     Dim eqPos As Integer
  233.     Dim quotes As String * 1
  234.  
  235.     eqPos = InStr(text, "=")
  236.     If eqPos > 0 Then
  237.         keyword = LTrim$(RTrim$(Left$(text, eqPos - 1)))
  238.         keyvalue = LTrim$(RTrim$(Mid$(text, eqPos + 1)))
  239.         quotes = Chr$(34)
  240.         If Left$(keyvalue, 1) = quotes And Right$(keyvalue, 1) = quotes Then
  241.             keyvalue = Mid$(keyvalue, 2, Len(keyvalue) - 2)
  242.         End If
  243.     End If
  244.  
  245.     ParseKeywordValue = (eqPos > 0) And (keyword <> "")
  246.  
  247. End Function
  248.  
  249.